package com.demo.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 流程：
 * 1.定义事件，一般是继承ApplicationEvent
 * 2.定义监听器：
 *        ①：实现ApplicationListener接口
 *        ②：方法上添加@EventListener注解，参数任意，不能为空；详情参照(EventListenerMethodProcessor,EventListenerFactory)
 * 3.配置监听器：将listener添加至Spring容器
 *      方法①：使用SpringApplication的addListeners方法
 *      方法②：使用注解把监听器纳入到Spring容器中管理起来
 *      方法③：在配置文件(application.properties)中添加配置 context.listener.classes= (详情参照 DelegatingApplicationListener)
 *      方法④：通过spring.factories机制(META-INF/spring.factories)
 * 4.发布事件:ApplicationContext的publishEvent()
 */
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(App.class);
        // app.addListeners(new MyApplicationListener()); // 方法①
        ConfigurableApplicationContext context = app.run(args);
        context.publishEvent(new MyApplicationEvent(new Object()));
        context.stop();
        context.close();
    }
}
